/**
 * 路由加载器模块
 * 功能：集中管理Express应用的所有路由，提供自动加载和手动注册两种方式
 * 作用：简化路由管理，统一路由挂载逻辑，便于维护和扩展
 */

// 导入文件系统模块，用于读取路由目录
const fs = require("fs");
// 导入路径处理模块，用于处理文件路径
const path = require("path");

/**
 * 自动加载并挂载路由
 * 功能：扫描指定目录下的路由文件，根据文件名自动映射路由路径并挂载
 * @param {Object} app - Express应用实例，用于挂载路由
 * @param {String} routesDir - 路由文件目录路径，默认值为项目的routes目录
 */
const loadRoutes = (app, routesDir = path.join(__dirname, "../routes")) => {
  console.log("📦 开始加载路由...");

  // 同步读取路由目录中的所有文件和文件夹
  fs.readdirSync(routesDir).forEach((file) => {
    // 过滤掉非JavaScript文件，只处理.js后缀的文件
    if (!file.endsWith(".js")) return;

    // 特殊处理API路由文件：api.js固定挂载到/api路径
    if (file === "api.js") {
      try {
        // 导入api路由模块
        const apiRouter = require(path.join(routesDir, file));
        // 将api路由挂载到/api路径
        app.use("/api", apiRouter);
        console.log("✅ API路由挂载成功: /api -> api.js");
        return; // 处理完成后跳出当前循环，继续下一个文件
      } catch (error) {
        // 捕获并打印api路由加载失败的错误信息
        console.error("❌ API路由加载失败:", error.message);
        return;
      }
    }

    // 跳过index.js文件，后续会单独处理（挂载到根路径）
    if (file === "index.js") return;

    // 处理其他常规路由文件（如user.js、admin.js等）
    // 从文件名中移除.js后缀，作为路由名称
    const routeName = file.replace(".js", "");
    // 生成路由路径，格式为"/路由名称"（如user.js对应路径为/user）
    const routePath = `/${routeName}`;

    try {
      // 导入当前路由模块
      const routeModule = require(path.join(routesDir, file));
      // 将路由模块挂载到生成的路径上
      app.use(routePath, routeModule);
      console.log(`✅ 路由挂载成功: ${routePath} -> ${file}`);
    } catch (error) {
      // 捕获并打印当前路由加载失败的错误信息
      console.error(`❌ 路由加载失败: ${file}`, error.message);
    }
  });

  // 单独处理主路由index.js，固定挂载到根路径"/"
  try {
    // 导入主路由模块
    const indexRouter = require(path.join(routesDir, "index"));
    // 将主路由挂载到根路径
    app.use("/", indexRouter);
    console.log("✅ 主路由挂载成功: / -> index.js");
  } catch (error) {
    // 捕获并打印主路由加载失败的错误信息
    console.error("❌ 主路由加载失败:", error.message);
  }

  console.log("📦 所有路由加载完成");
};

/**
 * 手动注册路由（可选方法）
 * 功能：显式导入并挂载路由，提供更精细的路由控制
 * 适用场景：需要严格控制路由加载顺序，或有特殊挂载逻辑的情况
 * @param {Object} app - Express应用实例，用于挂载路由
 */
const registerRoutes = (app) => {
  console.log("📦 开始注册路由...");

  // 显式导入路由模块
  const indexRouter = require("../routes/index"); // 主路由
  const apiRouter = require("../routes/api"); // API路由

  // 手动挂载路由到指定路径
  app.use("/", indexRouter); // 主路由挂载到根路径
  app.use("/api", apiRouter); // API路由挂载到/api路径

  console.log("✅ 路由注册完成");
};

/**
 * 获取API路由信息
 * 功能：返回系统中所有API路由的元信息，包括路径、方法和描述
 * 用途：可用于自动生成API文档、路由调试或前端路由映射
 * @returns {Array} 路由信息数组，每个元素包含path(路径)、method(方法)、description(描述)
 */
const getRoutesInfo = () => {
  return [
    { path: "/", method: "GET", description: "首页" },
    { path: "/api/health", method: "GET", description: "API健康检查" },
    { path: "/api/info", method: "GET", description: "API信息" },
    { path: "/api/users", method: "GET", description: "获取用户列表" },
    { path: "/api/users", method: "POST", description: "创建用户" },
    { path: "/api/users/:id", method: "GET", description: "获取用户详情" },
    { path: "/api/users/:id", method: "PUT", description: "更新用户信息" },
    { path: "/api/users/:id", method: "DELETE", description: "删除用户" },
  ];
};

// 导出路由加载器的三个核心方法，供应用入口文件调用
module.exports = {
  loadRoutes, // 自动加载路由方法
  registerRoutes, // 手动注册路由方法
  getRoutesInfo, // 获取路由信息方法
};
